#include<iostream>
#include<unistd.h>
#include<string>
#include<cerrno>
#include<cstring>
#include<sys/wait.h>
#include<sys/types.h>


//fork之后子进程能拿到父进程数据，通信：写时拷贝，对方都看不到
//char buffer[1024]不行
const int size=1024;

std::string getOtherMessage()
{
     static int cnt=0;
     std::string messageid = std::to_string(cnt);
     cnt++;
     pid_t self_id=getpid();
     std::string stringpid=std::to_string(self_id);

     std::string message="messageid:";
     message += messageid;
     message += "my pid is:";
     message += stringpid;

     return message;

}

//子进程写入
void SubProcessWrite(int wfd)
{
    int pipesize=0;

   std::string message="father ,i am your son process";
    char c='A';

   while(true)
   {
       std::cerr<<"+++++++++++++++++++++++++++++++"<<std::endl;

       std::string info=message+getOtherMessage();
       //这条消息，是子进程发给父进程的  
        write(wfd,info.c_str(),info.size());
//写入管道，没有写入\0.没有必要写入
       //sleep(1);
       std::cerr<<info<<std::endl;

      // write(wfd,&c,1);
      // std::cout<<"pipesize:"<<++pipesize<<"write charactor is:"<<c++<<std::endl;
       
      // if(c=='G')break;
       //sleep(1);
       
   }

   std::cout<<"child quit... "<<std::endl;
}
//父进程读取
void FatherProcessRead(int rfd)
{
    sleep(2);
    std::cout<<"-----------------------------------"<<std::endl;

    //sleep(5)
     char inbuffer[size];//c99
     while(true)
     {
         size_t n=read(rfd,inbuffer,sizeof(inbuffer)-1);
         //
         if(n>0)
         {
            inbuffer[n]=0;//=='\0'
            //std::cout<<"father get message:"<<inbuffer<<std::endl;
            std::cout<<inbuffer<<std::endl;

         }
         else if(n==0)
         {
            //如果read的返回值是0，表示写端直接关闭
         //读到文件末尾
         std::cout<<"client quit,father get return val:"<<n<<"father quit too!"<<std::endl;
         break;
         }
         else if(n<0)
         {
            std::cerr<<"read error"<<std::endl;
            break;
         }
 
         //todo
       //  sleep(1);
      // break;
     }
}

int main()
{
    //close(0);
   //1.创建管道
    int pipefd[2];
    int n=pipe(pipefd);//输出型参数，rfd,wfd
    if(n!=0)
    {
        std::cerr<<"errno:"<<errno << ":" << "errstring:" <<strerror(errno)<<std::endl;
        return 1;
    }
//pipefd[0]->0->r,pipefd[1]->1->w
    std::cout<<"pipefd[0]:"<<pipefd[0]<<",pipefd[1]:"<<pipefd[1]<<std::endl;
    
    sleep(1);
//2.创建子进程
//3.关闭不需要的fd
pid_t id=fork();
if(id==0)
{
    std::cout<<"子进程关闭不需要的fd了,准备发消息"<<std::endl;
    sleep(1);
    //子进程--write
    close(pipefd[0]);
    //if((fork)>0) exit(0);
    SubProcessWrite(pipefd[1]);

    close(pipefd[1]);

    exit(0);
}
    std::cout<<"父进程关闭不需要的fd了,准备收消息"<<std::endl;
   sleep(1); 
   //父进程--read
   //3.关闭不需要的fd
    close(pipefd[1]);
    FatherProcessRead(pipefd[0]);
    std::cout<<"5s,father close rfd"<<std::endl;
    sleep(5);
    close(pipefd[0]);

    int status=0;
    pid_t rid=waitpid(id,&status,0);
    if(rid>0)
    {
        std::cout<<"wait child process done,exit sig:"<<(status&0x7f)<<std::endl;
        std::cout<<"wait child process done,exit code(ign):"<<((status>>8)&0xFF)<<std::endl;

    }
    return 0;
}